using System;
using System.Web;
using System.Configuration;
using System.Web.Configuration;
using System.Collections.Generic;

namespace $safeprojectname$.Manager
{
    /// <summary>
    /// Gestionnaire de configuration
    /// </summary>
    public class ConfigHelper
    {
        private static Dictionary<string, string> configKeyDictionnay = new Dictionary<string, string>();
        private static Dictionary<string, Configuration> configurationKeyDictionnay = new Dictionary<string, Configuration>();

        /// <summary>
        /// Récupération de la valeur d'une clé de config définit dans la zone AppSetting d'un fichier de config
        /// </summary>
        /// <param name="key">Clé de configuration</param>
        /// <param name="path">Chemin du ficheir de configuration</param>
        /// <returns>Valeur de la clé de configuration</returns>
        public static string GetWebConfigValue(string key, string path)
        {

            if (configKeyDictionnay.ContainsKey(key + "|" + path))
            {
                return configKeyDictionnay[key + "|" + path];
            }
            Configuration rootWebConfig = null;
            if (configurationKeyDictionnay.ContainsKey(path))
            {
                rootWebConfig = configurationKeyDictionnay[path];
            }
            else
            {
                rootWebConfig = WebConfigurationManager.OpenWebConfiguration(path);
                configurationKeyDictionnay.Add(path, rootWebConfig);
            }

            if (rootWebConfig.AppSettings.Settings.Count < 0)
            {
                if (configKeyDictionnay.ContainsKey(key + "|" + path))
                {
                    configKeyDictionnay.Add(key + "|" + path, string.Empty);
                }
                return string.Empty;
            }

            KeyValueConfigurationElement customSetting = rootWebConfig.AppSettings.Settings[key];
            if (customSetting == null)
            {
                if (configKeyDictionnay.ContainsKey(key + "|" + path))
                {
                    configKeyDictionnay.Add(key + "|" + path, string.Empty);
                }
                return string.Empty;
            }

            if (configKeyDictionnay.ContainsKey(key + "|" + path))
            {
                configKeyDictionnay.Add(key + "|" + path, customSetting.Value);
            }
            return customSetting.Value;
        }

        /// <summary>
        /// Récupération de la valeur d'une clé de config définit dans la zone AppSetting d'un fichier de config
        /// </summary>
        /// <param name="key">Clé de config</param>
        /// <returns>Valeur de la clé de config</returns>
        public static string GetWebConfigValue(string key)
        {
            if (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath != null)
            {
                return GetWebConfigValue(key, System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
            }
            return GetAppConfigValue(key);
        }

        /// <summary>
        /// Récupération de la valeur d'une clé de config définit dans la zone AppSetting du fichier de config du projet
        /// </summary>
        /// <param name="key">Clé de config</param>
        /// <returns>Valeur de la clé de config</returns>
        public static string GetAppConfigValue(string key)
        {
            if (configKeyDictionnay.ContainsKey(key + "|AppSettings"))
            {
                return configKeyDictionnay[key + "|AppSettings"];
            }
            string _value = System.Configuration.ConfigurationManager.AppSettings[key];
            if (!string.IsNullOrEmpty(_value))
            {
                if (configKeyDictionnay.ContainsKey(key + "|AppSettings"))
                {
                    configKeyDictionnay.Add(key + "|AppSettings", _value);
                }
                return _value;
            }
            else
            {
                throw new ArgumentException("Key: " + key + " doesn't exist in config file.");
            }
        }

    }
}